// 先不利用封装的锁和条件变量

// 单消费者单生产者，3(关系)  2(角色)  1(缓存)
#include "BlockQueue.hpp"
using namespace BlockQueueModule;

void *Productor(void *args) // 线程入口函数,消费者
{
    BlockQueue<int> *ptr = static_cast<BlockQueue<int> *>(args);
    int data = 10;
    while (true)
    {
        ptr->Equeue(data);
        std::cout << "生产者生产了一个数据：" << data << std::endl;
        data++;
    }
}

void *Consumer(void *args)
{
    int data;
    BlockQueue<int> *ptr = static_cast<BlockQueue<int> *>(args);
    while (true)
    {
        sleep(1);
        ptr->Pop(data);
        std::cout << "消费者消费了一个数据：" << data << std::endl;
    }
}

int main()
{
    pthread_t _productor_1;
    pthread_t _consumer_1;
    pthread_t _productor_2;
    pthread_t _productor_3;
    pthread_t _consumer_2;

    BlockQueue<int> *ptr = new BlockQueue<int>(10);
    // 让生产者消费者线程看到同一份资源

    pthread_create(&_consumer_1, nullptr, Consumer, (void *)ptr);
    pthread_create(&_consumer_2, nullptr, Consumer, (void *)ptr);
    pthread_create(&_productor_1, nullptr, Productor, (void *)ptr);
    pthread_create(&_productor_2, nullptr, Productor, (void *)ptr);
    pthread_create(&_productor_3, nullptr, Productor, (void *)ptr);


    pthread_join(_productor_1, nullptr);
    pthread_join(_productor_2, nullptr);
    pthread_join(_productor_3, nullptr);
    pthread_join(_consumer_1, nullptr);
    pthread_join(_consumer_2, nullptr);

    return 0;
}
